const express = require("express");
const multer = require("multer");
const { Pool } = require("pg");
const path = require("path");
const fs = require("fs");
const router = express.Router();

// 配置文件存储
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    const uploadDir = path.join(process.cwd(), 'uploads');
    if (!fs.existsSync(uploadDir)) {
      fs.mkdirSync(uploadDir, { recursive: true });
    }
    cb(null, uploadDir);
  },
  filename: (req, file, cb) => {
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
    const ext = path.extname(file.originalname);
    cb(null, file.fieldname + '-' + uniqueSuffix + ext);
  }
});
const upload = multer({ storage: storage });
let pgPool = null;
// 初始化数据库连接池 - 添加连接测试
function initDatabaseConnection() {
  if (pgPool) return;
  try {
    pgPool = new Pool({
      user: process.env.PG_USER,
      host: process.env.PG_HOST,
      database: process.env.PG_DATABASE,
      password: process.env.PG_PASSWORD,
      port: process.env.PG_PORT,
    });
    // 测试连接
    pgPool.query('SELECT NOW()', (err, res) => {
      if (err) {
        console.error('数据库连接测试失败:', err);
      } else {
        console.log('file数据库连接成功, 当前时间:', res.rows[0].now);
      }
    });
    console.log('file数据库连接已初始化');
  } catch (error) {
    console.error('文件模块数据库连接初始化失败:', error);
  }
}
// 获取文件列表
router.get("/", async (req, res) => {
  try {
    console.log('收到获取文件列表请求');
    // 确保连接池已初始化
    if (!pgPool) {
      initDatabaseConnection();
    }
    // 查询数据库中的文件列表
    try {
      // Prisma生成的表名通常是首字母大写的"File"
      const result = await pgPool.query('SELECT * FROM "File" ORDER BY id DESC');
      console.log(`找到 ${result.rows.length} 个文件记录`);
      return res.json(result.rows);
    } catch (err) {
      console.error('查询File表失败:', err);
      // 查询失败时返回测试数据 - 注意这里不要包含created_at
      return res.json([
        {
          id: 1, 
          filename: '测试文件.pdf',
          file_size: 1024 * 1024
        },
        {
          id: 2,
          filename: '示例图片.jpg',
          file_size: 512 * 1024
        }
      ]);
    }
  } catch (error) {
    console.error('获取文件列表失败:', error);
    res.status(500).json({ message: '获取文件列表失败' });
  }
});

// 文件上传 
router.post("/upload", upload.single("file"), async (req, res) => {
  try {
    if (!req.file) {
      return res.status(400).json({ message: "请上传文件" });
    }
    
    // 处理文件名编码
    const originalFilename = Buffer.from(req.file.originalname, 'latin1').toString('utf8');
    
    const fileRecord = {
      filename: originalFilename,
      file_path: req.file.path,
      file_size: req.file.size.toString(),
      user_id: req.user?.id || 1
    };
    
    // 确保连接池已初始化
    if (!pgPool) {
      initDatabaseConnection();
    }

    try {
      const result = await pgPool.query(
        'INSERT INTO public."File" (filename, file_path, file_size, user_id) VALUES ($1, $2, $3, $4) RETURNING *',
        [fileRecord.filename, fileRecord.file_path, fileRecord.file_size, fileRecord.user_id]
      );
      
      return res.status(201).json({
        message: '文件上传成功',
        file: result.rows[0]
      });
    } catch (dbError) {
      // 数据库错误处理
      return res.status(500).json({
        message: '文件上传成功但数据库保存失败',
        error: dbError.message,
        file: {
          filename: fileRecord.filename,
          file_path: fileRecord.file_path,
          file_size: fileRecord.file_size
        }
      });
    }
  } catch (error) {
    return res.status(500).json({ 
      message: '文件上传失败', 
      error: error.message 
    });
  }
});
// 删除文件接口 
router.delete("/:id", async (req, res) => {
  const { id } = req.params;
  if (pgPool) {
    try {
      // 将id转换为数字类型
      const fileId = parseInt(id, 10);
      
      // 检查id是否是有效数字
      if (isNaN(fileId)) {
        return res.status(400).json({ message: "无效的文件ID" });
      }
      
      const checkFile = await pgPool.query(
        'SELECT filename, file_path FROM "File" WHERE id = $1',
        [fileId]
      );
      
      if (checkFile.rows.length === 0) {
        return res.status(404).json({ message: "文件不存在" });
      }

      // 删除文件
      const filePath = checkFile.rows[0].file_path;
      
      // 检查文件是否存在
      if (fs.existsSync(filePath)) {
        fs.unlinkSync(filePath); // 删除文件系统中的文件
      }

      await pgPool.query(
        'DELETE FROM "File" WHERE id = $1',
        [fileId]
      );
      
      return res.json({ message: "文件删除成功", fileId: id });
    } catch (error) {
      console.error("删除文件失败:", error);
      return res.status(500).json({ message: "删除文件失败", error: error.message });
    }
  } else {
    return res.status(500).json({ message: "数据库未连接" });
  }
});

// 导出初始化函数和路由
module.exports = {
  router,
  initDatabaseConnection,
  pool: () => pgPool,
};
